#include <STC89C5xRC.H>
#include <stdio.h>
#include "Int_IC.h"
#include "Com_Util.h"
#include "Dri_Uart.h"
#include "Int_Oled.h"
#include "Dri_IIC.h"
#include "Int_rc522.h"

void ConvertUidToStr(unsigned char *uid, unsigned char *str);

unsigned char displayStr[5];  // 用于存储要显示的字符串
unsigned char readData[5];  // 假设读取两个块的数据
unsigned char writeData[5] = "12";
unsigned char DesUid[5]; // 用于存储卡片ID
unsigned char defaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};  // 默认密钥

void main() 
{
    bool status;
    Dri_Uart_Init();
    IC_Init();
    Dri_Uart_WriteString("IC Card Test\r\n");
    Int_Oled_Init();
    Int_Oled_Clear();

    while (1)
    {
         // 寻卡并防冲突检测
        status = PcdRequest(PICC_REQIDL, DesUid);
        if (status == MI_OK) {
            status = PcdAnticoll(DesUid);
            if (status == MI_OK) {
                status = PcdSelect(DesUid);  // 选择卡片
                if (status == MI_OK) {
                    // 读取块 8 （每块16字节）
                    status = IC_ReadData(8, 1, readData, defaultKey, DesUid);
                    ConvertUidToStr(readData, displayStr);
                    if (status == MI_OK) {
                        Dri_Uart_WriteString(readData);
                        Int_Oled_ShowStr(0, 0, displayStr); 
                    }
                     else {
                        Dri_Uart_WriteString("Data Read Failed!\r\n");
                    }

                    // 写入数据到块 8 
                    // status = IC_WriteData(8, 1, writeData, defaultKey, DesUid);
                    // Dri_Uart_WriteString(writeData);
                    // if (status == MI_OK) {
                    //     Dri_Uart_WriteString("Data Write Successfully!\r\n");
                    // } else {
                    //     Dri_Uart_WriteString("Data Write Failed!\r\n");
                    // }
                }
            }
        }

        /* ------------------------测试 读写卡----------------------------------------- */
        // status = Read_IC_Card(DesUid);
        // if (status == true)
        // {
        //     PcdWrite(0x07, writeDate);
        //     PcdRead(0x07, readDate);
        // }
        // ConvertUidToStr(readDate, displayStr);

        // Int_Oled_ShowStr(0, 0, displayStr);  // 在OLED上显示转换后的UID
        // Dri_Uart_WriteString(displayStr);

        // /* ------------------------测试 IC卡 ID----------------------------------------- */
        // status = Read_IC_Card(DesUid);
        // if (status == true)
        // {
        //     // 将DesUid转换为十六进制字符串格式
        //     ConvertUidToStr(DesUid, displayStr);
        //     Int_Oled_ShowStr(0, 0, displayStr);  // 在OLED上显示转换后的UID
        //     Dri_Uart_WriteString(displayStr);
        // }
    }

    /* ------------------------------------------------------------------------------*/
    // Int_Oled_ShowStr(0, 0, "Hello World!");
    // while (1)
    // {
    //     /* code */
    // }
    
    /* ------------------------测试 IC卡感应----------------------------------------- */
    // Dri_Uart_WriteString("IC Card\r\n");
    // while (1)
    // {
    //     status = Read_IC_Card(DesUid);
    //     if (status == true)
    //     {
    //         Dri_Uart_WriteString("IC Card Read Success!\r\n");
    //         break;
    //     }
    //     else
    //     {
    //         Dri_Uart_WriteString("IC Card Read Fail!\r\n");
    //     }
    // }
}

void ConvertUidToStr(unsigned char *uid, unsigned char *str) {
    unsigned char i = 0;

    for (i = 0; i < 2; i++) {  // UID长度为4字节
        sprintf((char *)&str[i * 2], "%02X", uid[i]);  // 每个字节转为2位的十六进制
    }
    // while (uid[i] != "/0")
    // {
    //     sprintf((char *)&str[i * 2], "%02X", uid[i]);  // 每个字节转为2位的十六进制
    //     i++;
    // }
    
    str[i] = '\0';  // 字符串结束符
}

